<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    -js变量提升机制：
      当作用域形成之后，js代码执行之前，浏览器会对待var和function关键字的进行提前声明或者定义，
      这种预先处理的机制叫做变量提升（预解释）

    - 私有作用域的变量提升 a
      1,变量提升发生在当前作用域下
      2,当全局作用域形成的时候，不对私有作用域中的变量进行变量提升
      3,私有作用域中的var和function会在私有作用域执行的时候进行声明或定义
    浏览器很懒，对做过的事情，不会再做
        var fn=0;
    function fn(){

      var a=1;
      console.log(a);
      
    }
   fn();
    */

   /*
    - 带var和不带var的区别 b
      1，全局var声明一个变量，和window对象有互相映射关系，定义之前使用，值为undefined
        
    console.log(fn);
    var fn=10;
    window.fn=12;
  
      2，不带var，是给全局window添加了一个属性( "use strict"严格模式除外)，添加之前直接使用属性，报错
         console.log(a);
        a=12;
        
    var a=12;
   function fn(){
     a=12;
   }
   fn();
   console.log(window.a);
   */
  







  /*
    - 只对等号左边的进行变量提升 c
      1，等号左边是匿名函数或自执行函数不进行变量提升

    - 变量提升不重复 d
      1，不管是var 还是function声明，如果重复命名了，都只声明一次
      2，后面的值会覆盖前面的

    - if判断下的变量提升 e
      1, 在老版本浏览器中，if判断下的var只声明不定义，function声明加定义，
         为了迎合es6中的块级作用域，在新版本浏览器中，if判断下的var和function都只声明不定义
    */

    
   
   
</script>
</body>
</html>